{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Canvas Overview\n",
    "\n",
    "The drawing context"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import skia\n",
    "from IPython.display import display, Image"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The following is a helper util that takes drawing function and renders the result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def show(draw):\n",
    "    surface = skia.Surface(256, 256)\n",
    "    draw(surface.getCanvas())\n",
    "    image = surface.makeImageSnapshot()\n",
    "    display(Image(data=image.encodeToData()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preview\n",
    "Here is an example of a set of drawing commands to draw a filled heptagram."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABHNCSVQICAgIfAhkiAAAG0pJREFUeJzt3X9M1Pf9B/DnnceRE4ZsQlsWN7bqbRlnAx4ieOePSOPUIa2WDdEJ2IXMakolWtoZwB8IikVrZKLWZnZFbYBVYiqzYgNaWahuhWjCLRqqkdVxycAErYgg3Pv7R3t8wYLC8fl83p/P+/N6JPdPq5/PEz98nnw+7+M+LwNjjIEQoktG3gEIIfxQARCiY1QAhOgYFQAhOkYFQIiOUQEQomNUAIToGBUAITpGBUCIjlEBEKJjVACE6BgVACE6RgVAiI5RARCiY1QAhOgYFYBKHT9+nHcEogNUACpVU1ODpqYm3jGI4KgAVCw/P593BCI4KgAV++STT+ByuXjHIAKjAlAxxhgKCwt5xyACowJQuYqKCrS2tvKOQQRFBaByHo+H1gKIbKgANKCsrAxut5t3DCIgKgAN6Ovro7UAIgsqAI14//330dHRwTsGEQwVgEb09vZi9+7dvGMQwVABaEhpaSk6Ozt5xyACoQLQkO7ubuzbt493DCIQKgCNKSkpwf3793nHIIKgAtCYzs5OHDhwgHcMIggqAA3au3cvuru7eccgAqAC0KCOjg4cOXKEdwwiACoAjdq9ezd6e3t5xyAaRwWgUW63Gx9++CHvGETjqAA0rLCwEB6Ph3cMomFUABrW2tqKjz76iHcMomFUABqXn58PxhjvGESjqAA0rqWlBVVVVbxjCKezsxMff/wx7xiyowIQwNatW3lHEIrL5cLMmTPhdDp5R5EdFYAAXC4XPv30U94xhFBRUYGYmBjMmzcPYWFhvOPIjgpAEAUFBbwjaFp/fz82bdqElJQU9PT0YPPmzbwjKYIKQBANDQ24cOEC7xiadOfOHSxYsADvvvsuACA5ORlWq5VzKmVQAQiErgLG7urVq4iKikJ9fT0AwGAwIDc3l3Mq5VABCKS2tpbGiY1BRUUFYmNjcfv27YH/lpiYCJvNxjGVsqgABLNt2zbeEVSvv78fGzZsGLjfH0xv76hQAQjm9OnTNE7sCbz3+yUlJd/7fwsXLoTdbueQih8qAAHRIJHhNTY2Drnff5ye7v29qAAE9PHHH6OlpYV3DFU5duwYHA7HkPv9wRwOB+bNm6dwKv6oAATk8XhokMh3+vr68PrrryMtLe2Jz0/Iy8tTMJV6UAEI6sSJE7ofKtre3o65c+eitLT0iX/Obrdj8eLFCqVSFyoAQfX19el6kEhjYyMiIyNx6dKlp/5ZPd77e1EBCOwvf/mLLseJee/3RzNQ1Wq1YtmyZQqkUicqAIH19vZi165dvGMopq+vD6+99tpT7/cH27ZtGwwGg8zJ1IsKQHCHDh3SxTgxt9uNuXPn4r333hv13wkPD0dKSoqMqdSPCkBw3d3d2LNnD+8Ysrp06dKo7/cHy83NhdGo71NA31+9Tuzfv1/YcWKHDx/G/Pnz0d7ePqa/FxYWhjVr1sgTSkOoAHTg/v37w/7qq5b19vYiLS0N69at82k+wubNm2EymWRIpi1UADpRXFwszDgxt9sNh8OBY8eO+fT3Q0JCsHbtWolTaRMVgE50dnbi8OHDvGOMm/d+v7Gx0edtZGdnw2w2S5hKu6gAdKS4uFjT48RKS0sxb968Md/vDxYcHIz169dLmErbqAB0xO124+jRo7xjjFlPTw/S0tLw+uuv49GjR+PaVlZWFgIDAyVKpn1UADpTVFSEvr4+3jFG7fbt24iNjfX5fn+wwMBAbNiwQYJU4qAC0JnW1lacOHGCd4xRqa+vR1RUFK5evSrJ9tavX4/g4GBJtiUKKgAd0sJQ0f379yM+Ph537tyRZHsWiwXZ2dmSbEskVAA61NLSgpMnT/KOMayenh6kpKQgKytL0luVjIwMhISESLY9UVAB6NT27dt5R/ge7/1+RUWFpNs1mUy6GfQxVlQAOuVyuVBdXc07xgCp7/cHW7NmjS7GfPmCCkDH1PII7L1792LBggWS3e8PZjQadf3Aj6ehAtCxpqYm1NbWctt/d3c3kpKS8Oabb6K/v1+WfaxcuRLh4eGybFsEVAA6x+vhoa2trYiJiUFVVZVs+zAYDKq5ylErKgCdO3/+vOLjxOrq6hAVFSX7AJNly5bpZsinr6gAiKKPxH7nnXfw61//WpGnFNG9/9NRARCcOXNG9p/G3vv9t99+W7b7/cEWL16suzFfvqACIADkHSqqxP3+4/Q66GOsqAAIAODkyZOyjBOrqalR5H5/sPnz58PhcCi2Py2jAiAAAMYYduzYIek2d+7cid/85jeKP5U4JydH0f1pGRUAGSDVOLGuri4kJiYiJydH8Q8d2e12LFy4UNF9apnsBeByuZCeno5du3bh888/x8OHD+XeJfGRx+PBzp07x7WNGzduIDo6mtuvGdP7/mPEFPD111+zyMhIBoCZTCYWExPDNmzYwCorK5nb7VYiguasXr2aAVD8ZTabWVtbm0+Zz549y4KCgrjkBsBsNhvzeDwSHwmxKVIAjDH28OFDlpqaOuyBCw8PZytXrmQHDhxgTU1NrK+vT6lYqsWrAACwDRs2jDlvfn4+MxgM3DIDYOXl5TIcCbEpVgBef/7zn5mfn98TD2RgYCB78cUXWV5eHjt79iy7e/eu0jG541kAFouFtbe3jyrn/fv32dKlS7me+ACY1Wpl/f39Mh8V8SheAIwx9sUXX7DQ0NBRH1yj0cheeOEFtnbtWlZWVsa++uorHrEVxbMAALDNmzc/NeO1a9fYL3/5S+4nPwD2wQcfyH9QBMSlABhjrK2tjUVHR/t8wJ999lm2fPlyVlxczBoaGlhPTw+vL0UWvAsgMDCQffPNNyPmO336NAsICOB+4gPf3kI+evRIwaMjDm4FwBhjPT09I64LjPXl7+/PnE4ny87OZqdOnWIdHR08v7Rx410AAFh+fv73cnk8HrZlyxbu9/uDX6WlpRyOkBi4FoDXoUOHnrou4MvLarWy9PR0duTIEdbc3KypFWI1FEBwcDB78ODBQKa7d++yRYsWcc81+BUSEiLc1Z+SVFEAjI19XcDXb+glS5awHTt2sLq6uiHf3GqjhgIAwIqLixlj397vT506lXuex1979uzhfKS0TTUFwNi36wKxsbGKfgPZ7XaWmZnJKioqWGtrK+9/ggHp6encTy4A7LnnnmPl5eUsMDCQe5bHX5MnT2ZdXV28D5WmqaoAGGPs0aNHbO3atdy+qaZMmcJWrFjB9u/fz7788ktuv5OglisANb927NjB5diIxMAYY1ChY8eOISMjg/swy4CAAMyaNQsOhwNOpxMOhwOTJk2Sfb+pqak4fvy47PvRqsDAQLjdbprzN04m3gFGkpqaioiICCQmJsLtdnPL0dXVhfPnz+P8+fMAvn3OXEREBBwOx0Ap0GOnlJeZmUknvwRUewXg1d7ejpdeegmXLl3iHWVEoaGhQwph5syZ8Pf3H9c26QpgZBaLBf/5z39o0o8U+N6BjM6jR4/Y+vXrud9zjvZlNpvZ7Nmz2aZNm1hVVRX73//+N+avmdYARn5lZWXJ8F2mT6q/AhhMLesCvnj++ecH1hCcTidsNhuMxpE/jU1XAMMzm824desWTfqRiGrXAIajlnUBX9y8eRM3b94cmHM/adIkxMXFDRRCbGws3dOOwquvvkonv4Q0dQXg1dHRgd/+9rf4/PPPeUeR1IwZM+B0OuF0OnH48GHhvj4p3Lp1iyb9SEiTBQAA/f392LhxI0pKSnhHIQpJS0vDhx9+yDuGUDRbAF4VFRVIT09HT08P7yhERgaDAdevX6e3XCWm+YeCrlixApcvX8aUKVN4RyEySkpKopNfBpq/AvC6c+cOli9fjvr6et5RiAyam5ths9l4xxCO5q8AvCZPnoyLFy9i48aNvKMQiSUmJtLJLxNhrgAGo3UBsTQ2NtKcP5kIcwUwmHddgN4u0r74+Hg6+WUkZAEAQGRkJK5cuYL4+HjeUcg40JgveQlbAAAQHByMzz77DNnZ2byjEB/Y7XYqcJkJXQAAYDQa8c4776CyshIBAQG845AxkHpYKfk+IRcBR+JyuZCQkCDJAEwiL5vNhubmZt4xhCf8FcBgNpuN1gU0Ytu2bbwj6IKurgC8PB4PcnJyUFRUxDsKGYbVasX169dhMBh4RxGerq4AvIxGI3bt2oWTJ0/SuoAK5eXl0cmvEF1eAQz273//G4mJibh58ybvKOQ78fHxmDNnDuLi4uB0OhEUFMQ7krB0XwAAcO/ePSQnJ6OmpoZ3FPIYo9GIiIiIgacpORwOTJs2jXcsYVABfIcxhi1btqCwsBD0T6JuzzzzzJDHtM+cORNms5l3LE2iAnhMdXU1UlJS0NXVxTsKGSV/f39ER0cPeeZiaGgo71iaQAUwjOvXryMhIQE3btzgHYX4aNq0aUOuEmw2Gy0sDoMKYAT37t3DqlWr8Pe//513FCKBH/zgB5g9ezacTufAAuPEiRN5x+KOCuAJGGPYvn078vPzaV1AMBMmTEBkZOSQxcWf/vSnvGMpjgpgFGpqapCcnIx79+7xjkJkNGXKlCG3DTNmzMCECRN4x5IVFcAo3bhxAwkJCbh+/TrvKEQhEydOxKxZs4YsLioxGFZJVABj0NXVhZSUFFRXV/OOQjgwGAz41a9+NeQq4Re/+AXvWONCBeCDgoICbN26FR6Ph3cUwllISMiQQoiJiRn3YFglUQH4iNYFyHDMZjPsdvtAKcyZMwfPPPMM71gjogIYB1oXIKPx/PPPD7lKmD59+hMHwyqJCmCcurq6kJaWhqqqKt5RiEYEBQUNfNDJ4XAgLi6O22BYKgCJ7Nq1C7m5ubQuQMZswoQJeOGFF4ZcJfzsZz9TZN9UABKqq6tDUlISOjs7eUchGvfjH/94SCHY7XaYTCbJ90MFILHW1lYkJCTA5XLxjkIEYrFYEBMTM1AKTqcTP/zhD8e9XSoAGXR1deEPf/gDKisreUchAouIiEBsbOzAeoIv49PUsRQpGKPRSJ8dILLr6+sb9zakv6nQOboFIHKwWCyYOXPmkF9L/tGPfjTu7VIBSIgWAYlUwsLChpzsM2bMgJ+fn+T7oQKQCL0NSHw1YcIETJ8+fcgJr9TbgFQA40QfECJj5f1FIO/JzvMXgagAxoF+FZiMxs9//vMhP93V9KvAVAA+og8DkeFo7cNAVAA+oI8DEy/vx4G9J7zWPg5MBTAGdL+vbyI+EIQKYJTofl9/vI8EG/zrt6I9EowKYBSqq6vx+9//nu73Bed9KOjg995FfygoFcAT0GPBxeV9LPjgy3k9PhacCmAENBhELJMmTRp4750Gg/w/KoBh0Ggw7aPRYKNDBfAYGg6qPd7hoIMX62g46OhQAXyHMYa8vDzs3LmT7vdVjsaDS4cKAN/e7ycnJ6OmpoZ3FPIYg8EAm8025ISfNm0a71jC0H0BuFwuvPzyy3S/rxIWiwVxcXGYM2cOnE4nZs+ejaCgIN6xhKXrR4JVVVVh9erV6O7u5h2FDFJWVobU1FTeMXRBlwXg8XiQk5ODoqIi3lHIMKxWK65fv06r9gpQx2cSFdTZ2YmFCxfSya9iLS0tNGhFIbq6AnC5XEhISEBrayvvKOQpbDYbmpubeccQnm6uAP72t79h1qxZdPJrhMvlwqeffso7hvCELwCPx4Ps7GwkJyfjwYMHvOOQMcjNzeUdQXhC3wLcuXMHycnJqKur4x2F+Kiurg4LFizgHUNYwl4BXL16FVFRUXTya1xhYSHvCEITsgAqKioQGxuL27dv845Cxqm2thZNTU28YwhLuALYuHEjUlJS0NPTwzsKkcj27dt5RxCWMGsAd+7cwfLly1FfX887CpFBc3OzT8MvyZMJcQXgvd+nk19cdBUgD81fAVRUVCA9PZ0u+QVnNBpx7do1WK1W3lGEotkrgL6+Przxxht0v68THo+H3hGQgSavANrb2/HKK6/gH//4B+8okoqKihr4GOwHH3yAc+fO8Y6kOrdu3UJ4eDjvGMLQ3PMAGhsbkZiYCLfbzTvKuAx+SKXT6URsbOyQAZH0MNLhFRUV4dChQ7xjCENTBXDs2DFkZGSgt7eXd5Qxmzp16pBnzk+fPp0+7uqDo0ePYsuWLQgLC+MdRQiaKADv/b5Wmt9sNg95SOWcOXPoIZUS6e3tRXFxMd59913eUYSg+jWA9vZ2vPTSS7h06RLvKCMKDQ0d8tN95syZ4x4QmZqaiuPHj0uUUCwWiwVtbW0IDg7mHUXzVH0FoMb7fYPBgIiIiCEPqaS3ppTV3d2NPXv2oKCggHcUzVPtFcCRI0eQmZnJ/X4/ICBgyIBIh8OhyIBIugJ4ssDAQLjd7iELp2TsVHcF0Nvbi4yMDBw7dozL/n/yk58MOdmjoqKEHxCpRffv38f+/fuRk5PDO4q2MRVpa2tjsbGxDIBiL7vdzt544w1WWVnJ/vvf//L+JxiQlpam6L/DSK/nnnuOHT16lE2cOJF7lsdfISEh7MGDB7wPlaappgC++OILFhoaKus3THBwMFuyZAkrKChgdXV1qv7mSU1N5X6CAWB79+5ljDF27do1NnXqVO55RspHfKOKAjh48CDz8/OT/JvDarWy9PR0duTIEdbc3Mw8Hg/vL3XUVq9ezf3kCg4OHlKSd+/eZYsWLeKea/ArLCyM9fT0cDxS2sa1AHp6eiT7Sefv78+cTid766232KlTp1hHRwfPL23c1FAAO3bs+F4uj8fD8vLymMFg4J7P+zp06BCHIyQGbgXQ1tbGoqOjfT7ozz77LFu+fDnbs2cPa2hoEO6nAO8CCAwMZN98882I+U6fPs0CAgK4n/wAWHh4OHv06JGCR0ccXN4FqK+vR1JSEtrb20f1541GI2w228DKvMPhwNSpU2VOqW+ZmZlPfItt6dKlaGxsREJCAve5iq2trThx4gTS09O55tAkpRunpKSEmUymp/70efHFF9mWLVvY2bNn2d27d5WOyR3PKwCLxcLa29tHlfPu3bts6dKl3K8CrFYr6+/vl/moiEexAnj48CFbsWLFiJdwq1atYgcOHGBNTU10IBnfAsjKyhpz3u3bt3NfF6ioqJDhSIhNkQL4+uuvWWRkJAPA/Pz8WExMDMvKymKVlZXM7XYrEUFzeBWA2WxmbW1tPmU+e/YsCwoK4lYANptN4qMgPtkLoLGxkaWnp7PCwkJ24cIF1t3dLfcuhZCens7lJHrttdfGlbulpYVFRERwK4Hq6mqJjoA+qPazAHrH47MAJpMJX3311bifuNPV1YWUlBRUV1dLlGz07HY7GhsbFd+vVmn2mYBEeqtWrZLkcVsBAQE4ffo0CgoKYDQq+y3W1NSE2tpaRfepZVQABMC3H3OWehhnTk4Ozpw5g6CgIEm3+zT0MeHRowIgAICkpCRZnmuwaNEiNDU1KTrU48KFC2hoaFBsf1pGBUAAANu2bZNt21OnTsW//vUvvPLKK7Lt43H0CPHRoQIgSEhIkP0ntMViwcmTJ1FUVKTIusCZM2fgcrlk34/WUQEQ5OfnK7avt99+G5999pkiz/PbunWr7PvQOioAnYuPj4fdbld8n1euXJH9qqOqqgotLS2y7kPrqAB0jtcjtcLDw2VfF2CMKXp1o0VUADpmt9sRHx/Pbf/edYHi4mLZnrv40UcfobW1VZZti4AKQMfU8tPxzTffxLlz5zB58mTJt+3xeLBz507JtysKKgCdstlsSEhI4B1jgHddIDIyUvJt//Wvf1XVbAk1oQLQKTnf9/fVlClTcPnyZaxYsULS7fb29mL37t2SblMUVAA6ZLVakZSUxDvGsPz9/VFeXo59+/bBZJLugVVHjhxBR0eHZNsTBRWADuXm5qp+MnFWVhbq6uokWxfo7u7G3r17JdmWSKgAdCY8PByrVq3iHWNU5s6dK+m6wIEDB9DZ2SnJtkRBBaAzmzdvlvTSWm5Srgvcv38fJSUlEqQSBxWAjoSFheHVV1/lHWPMvOsCJSUl4y6vffv2obu7W6Jk2kcFoCNvvfUWzGYz7xg+y8zMRH19PUJDQ33eRmdnJ0pLSyVMpW1UADoREhKCtWvX8o4xbnFxcbh69Sqio6N93sbu3bu5j51XCyoAndi4cSMsFgvvGJIICwtDQ0MDUlNTffr7HR0deP/99yVOpU1UADoQGBiIzMxM3jEkZTabUVZWhoMHD8LPz2/Mf7+wsBB9fX0yJNMWKgAdyMrKeuKYLy1bt24dLl68OOZ1AbfbjbKyMplSaQcVgOAsFgs2bdrEO4asfF0XKCoqgsfjkSmVNlABCG79+vWKPH2HN++6wB//+MdR/52WlhZUVlbKmEr9qAAEZjab8ac//Yl3DMWYzWa89957KCsrG/XbnQUFBdDzbBwqAIFlZGQgJCSEdwzFpaamoqGhAWFhYU/9sy6XC5988okCqdSJCkBQJpNJ8kEfWhIdHY2rV68iLi7uqX9WLQ9G4YEKQFCpqamj+gkostDQUNTX12PdunVP/HNNTU04d+6cQqnUhQpAQEajEZs3b+YdQxVMJhMOHjz41HUBvQ4SoQIQ0O9+9ztZxnxp2dPWBS5evKjLcWJUAIIxGAzIy8vjHUOVnrYuoMe1ACoAwSQmJio6iFNrvOsCw/1qdE1NDZqamjik4ocKQDA0DuvpTCYTSkpKUF5eDn9//yH/T2+jxakABLJw4ULFx3xp2YoVK3D58mVMmTJl4L+dOnVKV0NFqQAEwmvMl5ZFRkbiypUrmDt3LoBvx4npaZAIFYAgHA4H5s+fzzuGJk2ePBnnz59HVlYWAKC8vFw348SoAARBK//jM2HCBOzbtw/l5eXw8/PDjh07eEdSBBWAAOx2OxYvXsw7hhC86wK1tbW6GCdGBaBSY5mWSz/9pRUZGYkvv/wS//znP3lHkR0VgEr19/eP6s9ZrVa8/PLLMqfRn8mTJ+vi35UKQOO2bt2q+jFfRL2oADQsPDwcK1eu5B2DaBgVgIbl5ubCaKRDSHxH3z0aFRYWhjVr1vCOQTSOCkCjtDbkk6gTFYAGiTLmi/BHBaBB2dnZmh7ySdSDCkBjgoODsX79et4xiCCoADRmw4YNwo75IsqjAtCQwMDAgU+sESIFKgAN0cuYL6IcKgCNMJvNyM7O5h2DCIYKQCPWrl2ryzFfRF5UABpgMplo0AeRBRWABqxZs0b3Y76IPKgAVM5oNOp6yCeRFxWAyqWkpCA8PJx3DCIoKgAVMxgM2LZtG+8YRGBUACq2bNkyGvJJZEUFoGJ070/kRgWgUkuWLKExX0R2BsYY4x2CEMIHXQEQomNUAIToGBUAITpGBUCIjlEBEKJjVACE6BgVACE6RgVAiI5RARCiY1QAhOgYFQAhOkYFQIiOUQEQomNUAIToGBUAITr2f8le7Ot38sOJAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def draw(canvas):\n",
    "    from math import cos, sin\n",
    "    scale = 256.\n",
    "    R = 0.45 * scale\n",
    "    TAU = 6.2831853\n",
    "\n",
    "    path = skia.Path()\n",
    "    path.moveTo(R, 0.)\n",
    "    for i in range(7):\n",
    "        theta = 3 * i * TAU / 7\n",
    "        path.lineTo(R * cos(theta), R * sin(theta))\n",
    "    path.close()\n",
    "\n",
    "    paint = skia.Paint()\n",
    "    paint.setAntiAlias(True)\n",
    "\n",
    "    canvas.clear(0xFFFFFFFF)\n",
    "    canvas.translate(0.5 * scale, 0.5 * scale)\n",
    "    canvas.drawPath(path, paint)\n",
    "    \n",
    "show(draw)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Details\n",
    "\n",
    "`Canvas` is the drawing context for Skia. It knows where to direct the drawing (i.e. where the screen of offscreen pixels are), and maintains a stack of matrices and clips. Note however, that unlike similar contexts in other APIs like postscript, cairo, or awt, Skia does not store any other drawing attributes in the context (e.g. color, pen size). Rather, these are specified explicitly in each draw call, via a `Paint`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def draw(canvas):\n",
    "    canvas.save()\n",
    "    canvas.translate(128., 128.)\n",
    "    canvas.rotate(45.)\n",
    "    rect = skia.Rect.MakeXYWH(-90.5, -90.5, 181.0, 181.0)\n",
    "    paint = skia.Paint()\n",
    "    paint.setColor(skia.ColorBLUE)\n",
    "    canvas.drawRect(rect, paint)\n",
    "    canvas.restore()\n",
    "    \n",
    "show(draw)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The code above will draw a rectangle rotated by 45 degrees. Exactly what color and style the rect will be drawn in is described by the paint, not the canvas.\n",
    "\n",
    "Check out more detailed info on creating a `Canvas` object in [Canvas-Creation.ipynb](Canvas-Creation.ipynb).\n",
    "\n",
    "To begin with, we might want to erase the entire canvas. We can do this by drawing an enormous rectangle, but there are easier ways to do it.\n",
    "\n",
    "```python\n",
    "def draw(canvas):\n",
    "    paint = skia.Paint()\n",
    "    paint.setColor(skia.ColorWHITE)\n",
    "    canvas.drawPaint(paint)\n",
    "```\n",
    "\n",
    "This fills the entire canvas (though respecting the current clip of course) with whatever color or shader (and xfermode) is specified by the paint. If there is a shader in the paint, then it will respect the current matrix on the canvas as well (see `Shader`). If you just want to draw a color (with an optional xfermode), you can just call drawColor(), and save yourself having to allocate a paint.\n",
    "\n",
    "```python\n",
    "def draw(canvas):\n",
    "    canvas.drawColor(skia.ColorWHITE)\n",
    "```\n",
    "\n",
    "All of the other draw APIs are similar, each one ending with a paint parameter."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABHNCSVQICAgIfAhkiAAAIABJREFUeJztnXe8VMX5uJ85W+6lXC6KXKQJdkFBiLHHhhILIGqMXUGJJbafol/UxGgSjWISY4wlGntJNBgNthhbrGgihqjYYhRBlFggVLn3bnt/f5xzds/unu1nd8/unYfPYe/OzpmZLe8777zzzoxCEMrmYaAX0Bfobz1aV3cQVgOrE7BlsPwqNEVR0deo6bGUKZk3AX2AOKCsywACqcc4EBcwFLyVgLXA7oYXbda4oFAVl6GVSM8jWOqXHmB28oeiCGDqkDCKVoReQG+IGNAFRBVEgRiIAE8JiW97+wby4YVQ9CTK/by04mhclIgU9e0F+T8ShDBN/AEo2oH+9GdjVjDO9Z4N34HVnSDdQBeoLpA1EFgH0ZM9ew8Ng1ZIJlph+IeiFECQkxFagTagDcVgPuQIRtK7qEoWr4fNn8a0BNaDWg98DfGZFbVdY9GsikUriupTcFAe5CgSRBAS1tfRSozpRQs/wMjeEJ8Ke7aA6gSJADEI/qTsdmsciEf//IYq4p+mMgoqgATdQAKFwSS2J865OfPuD4SArXO8/txkOHADywKIQCIGYW0F+IZGVBxaQVRG3iGAwV4oNgDaeYMrGcOQ3AW5pOUqeOEyGHc9EDWtgcS1JbVZ08D4SSjrrbz8QE4LwGAcighgEOeuvMJ/k/Uojgvg+Bz5xwyB+BXAKlBfg3Fc6Q3XNCZ+siy01ZDDAgiwKdAboY0Efy9YSAAzHGidI60f8Gdg30L3Ho0ZM9AJ8UeLbbZGY1JLgW1GiyGHBRAF4hhFxgklgNMz0tZQWPgBXvwBsB4kWlRVGk0atbQgmtFayLIADPoBvVBsQJz3iysEeAPYvsxGBCYAYvkD5pVZSJOSSCT45JNP+PjjjwkGg4wYMYJNNtmk3s1qeKopvI1kKaRZACfyfczeP8EsTiupoI4KGjFrKmDNDEw7s/xyjj76aJRSPP/8866vv/XWWyil2HffYmyTdIYPH87w4cNzPq8Gf//73xk/fjybbropEyZMYM8992TEiBHsuuuuvPTSS2l5lVIcdNBBecvr168fm2++ecntiMViKKVQqvF7PJtqWg6NZCWk2fj38jurwcKVnFNSQc+Q2+lXiCv/H/z8d4AB9z4Dd5VZTiKRSHvMpMigR1cikQjhcDjnc69577332HXXXQE455xzGDt2LOvWrePll19mzpw57Lnnnrz66qvssssuyXtyvW+bwYMHM3DgwKq1uVnIpQTKFebM+/xkIaQpgBagE+Ev/LHkgm4nXQEMB5aWcP9froODTgbJ/xvuMdx4440AXHPNNZxzTkoZn3XWWey0006cf/753HjjjWkKoBD//ve/PW9nT8JNcMtRCn5SCMkhwFBChBEUsL/DfZdpzrzES1mFXAY873i+APgUODUjn1LZ1xBrdnH/CcBXwFowNvTkvRXN0qVLOfXUU9l2223ZdtttOeuss3j33XdLLueVV17h4IMPZtCgQQwaNIhDDjmEt956q6w2vf322wBss802Wa9Nnz6dPfbYg1AolPP+RCLBpZdeysEHH8wNN9wAwCmnnMJ5552Xlu+JJ57grLPOYvPNN2eHHXbgvPPO46mnniqrzT0RL4YQdR0uiMUWomSQGOIk1yDJDVyurDy4X06M3iJGL9cqCnLEEUcIIM8++6zr62+88YYAMmHChGTaggULpK2tTQDp6OiQHXfcUQBpa2uT559/Ppmvo6NDhg0blvP5nDlzkmEQU6ZMkb333jv5/Omnny75vZx++ukCyOjRo+W1116TeDyeNz8g+++/v4iIxOPx5P0TJ06Ur7/+WkRE2traZLPNNkvec/fddyfbuMcee8gee+yRfP7II48k88Xj8eRnoimdckMsa9M2i9GiZLBDAbwn7wmCPCPPJNP2kX1yNux0SRf+8W6VuQh85nOlRFS6HioaWwF0dHTIVlttlXV1dHSkKYBEIiG77LKLAHLLLbdINBoVEZGnn35aABk7dmyy7HwKYN26dcmy33zzzWQeu5xhw4ZJd3d3Se/lgw8+SComW/iOOOIIue666+Sjjz7Kym8rgHg8Lt///veTz23hF8lWABMnThRA3n777WTaH/7wBwHklFNOSSu/o6Mj7V5N+fhJGSAisoMEZZwoGSqB5AthCbtW/E35ZvmVFaEA+hkiISXSHiq9fFsBtLW1SUdHR9ZlC5StABYsWCCAbLXVVlllTZgwQQD54IMPRCS/Apg7d64AMnXq1KxybEtg4cKFJb+fpUuXysUXXyyjR492BlkKIJMmTZKlS5cm89q9/WmnnZYU/vXr16eVl6kA5s6dm9bTi6SU1jHHHJOWPnbsWNlll11K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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def draw(canvas):\n",
    "    canvas.drawColor(skia.ColorWHITE)\n",
    "    \n",
    "    paint = skia.Paint()\n",
    "    paint.setStyle(skia.Paint.kStroke_Style)\n",
    "    paint.setStrokeWidth(4)\n",
    "    paint.setColor(skia.ColorRED)\n",
    "    \n",
    "    rect = skia.Rect.MakeXYWH(50, 50, 40, 60)\n",
    "    canvas.drawRect(rect, paint)\n",
    "    \n",
    "    oval = skia.RRect()\n",
    "    oval.setOval(rect)\n",
    "    oval.offset(40, 60)\n",
    "    paint.setColor(skia.ColorBLUE)\n",
    "    canvas.drawRRect(oval, paint)\n",
    "    \n",
    "    paint.setColor(skia.ColorCYAN)\n",
    "    canvas.drawCircle(180, 50, 25, paint)\n",
    "    \n",
    "    rect.offset(80, 0)\n",
    "    paint.setColor(skia.ColorYELLOW)\n",
    "    canvas.drawRoundRect(rect, 10, 10, paint)\n",
    "    \n",
    "    path = skia.Path()\n",
    "    path.cubicTo(768, 0, -512, 256, 256, 256)\n",
    "    paint.setColor(skia.ColorGREEN)\n",
    "    canvas.drawPath(path, paint)\n",
    "    \n",
    "    image = skia.Image.MakeFromEncoded(\n",
    "        skia.Data.MakeFromFileName('../skia/resources/images/color_wheel.png'))\n",
    "    canvas.drawImage(image, 128, 128, paint)\n",
    "\n",
    "    rect2 = skia.Rect.MakeXYWH(0, 0, 40, 60)\n",
    "    canvas.drawImageRect(image, rect2, paint)\n",
    "    \n",
    "    paint2 = skia.Paint()\n",
    "    text = skia.TextBlob.MakeFromString('Hello, Skia!', skia.Font(None, 18))\n",
    "    canvas.drawTextBlob(text, 50, 25, paint2)\n",
    "    \n",
    "show(draw)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
